package com.ctg.itrdc.imageconsole.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.httpclient.util.DateUtil;
import org.springframework.stereotype.Component;

import com.ctg.itrdc.imageconsole.data.dao.IDockerAppImageDao;
import com.ctg.itrdc.imageconsole.data.dao.IDockerAppTypeDao;
import com.ctg.itrdc.imageconsole.data.dao.IDockerImageDao;
import com.ctg.itrdc.imageconsole.data.dto.DockerAppTypeDTO;
import com.ctg.itrdc.imageconsole.data.dto.DockerImageFileDTO;
import com.ctg.itrdc.imageconsole.data.entity.DockerAppImage;
import com.ctg.itrdc.imageconsole.data.entity.DockerAppType;
import com.ctg.itrdc.imageconsole.data.entity.DockerImage;
import com.ctg.itrdc.imageconsole.dto.DockerAppTypeDetailDTO;
import com.ctg.itrdc.imageconsole.service.IDockerAppTypeService;
import com.ctg.itrdc.paspsdk.common.entity.PageInfo;
import com.ctg.itrdc.paspsdk.common.utils.bean.BeanUtils;
import com.ctg.itrdc.paspsdk.common.utils.type.DateUtils;
import com.ctg.itrdc.paspsdk.common.utils.type.StringUtils;

@Component("dockerAppTypeService")
public class DockerAppTypeServiceImpl implements IDockerAppTypeService {

	@Resource
	private IDockerAppTypeDao dockerAppTypeDao;

	@Resource
	private IDockerAppImageDao dockerAppImageDao;

	@Resource
	private IDockerImageDao dockerImageFileDao;
	
	@Override
	public PageInfo<DockerAppTypeDTO> queryDockerAppTypePageInfo(DockerAppTypeDTO dockerAppTypeDTO, Long tenantId,
			Integer currentPage, Integer perPageNum) {
		
		if(dockerAppTypeDTO == null)
			dockerAppTypeDTO = new DockerAppTypeDTO();
		
//		dockerAppTypeDTO.setTenantId(tenantId);
		
		PageInfo<DockerAppTypeDTO> pi = dockerAppTypeDao.jdbcFindPageInfo(dockerAppTypeDTO, currentPage, perPageNum);
		List<DockerAppTypeDTO> appTypeList = pi.getList();
		if(appTypeList != null && appTypeList.size() > 0) {
			for(DockerAppTypeDTO appType : appTypeList) {
				int count = dockerAppImageDao.countByDockerAppTypeId(appType.getId());
				appType.setDockerImageFileCount(count);
			}
		}
		return pi;
	}

	@Override
	public PageInfo<DockerImageFileDTO> queryImageFileByGroupId(Long groupId, DockerImageFileDTO dockerImageFileDTO, 
			Long tenantId, Integer currentPage, Integer perPageNum) {
		if(dockerImageFileDTO == null)
			dockerImageFileDTO = new DockerImageFileDTO();
//		dockerImageFileDTO.setTenantId(tenantId);
		return dockerImageFileDao.queryImageFileByGroupId(groupId, dockerImageFileDTO, currentPage, perPageNum);
	}
	
	@Override
	public PageInfo<DockerImageFileDTO> canAddImageFileByGroupId(Long groupId, DockerImageFileDTO dockerImageFileDTO, 
			Long tenantId, Integer currentPage, Integer perPageNum) {
		if(dockerImageFileDTO == null)
			dockerImageFileDTO = new DockerImageFileDTO();
//		dockerImageFileDTO.setTenantId(tenantId);
		return dockerImageFileDao.canSelectImageFileByGroupId(groupId, dockerImageFileDTO, currentPage, perPageNum);
	}
	
	@Override
	public List<DockerAppTypeDTO> findAllDockerAppTypeAndCount() throws Exception {
		List<DockerAppType> dockerAppTypeList = dockerAppTypeDao.selectByExample(new DockerAppType());
		List<DockerAppTypeDTO> returnList = new ArrayList<DockerAppTypeDTO>();
		if(dockerAppTypeList != null && dockerAppTypeList.size() > 0) {
			for(DockerAppType dockerAppType : dockerAppTypeList) {
				int count = dockerAppImageDao.countByDockerAppTypeId(dockerAppType.getId());
				//DockerAppTypeDTO dockerAppTypeDTO = new DockerAppTypeDTO(dockerAppType, count, null);
				DockerAppTypeDTO dockerAppTypeDTO = new DockerAppTypeDTO();
				BeanUtils.applyIf(dockerAppTypeDTO, dockerAppType, true);
				dockerAppTypeDTO.setDockerImageFileCount(count);
				returnList.add(dockerAppTypeDTO);
			}
		}
		return returnList;
	}

	public DockerAppTypeDetailDTO findDockerAppTypeAndIncludeImage(Long dockerAppTypeId) throws Exception {
		
		DockerAppType dockerAppType = new DockerAppType();
		dockerAppType.setId(dockerAppTypeId);
		DockerAppType goalDockerAppType = dockerAppTypeDao.selectByPrimaryKey(dockerAppType);
		
		DockerAppTypeDetailDTO dockerAppTypeDetailDTO = new DockerAppTypeDetailDTO();
		BeanUtils.applyIf(dockerAppTypeDetailDTO, goalDockerAppType, true);
		
		List<DockerImageFileDTO> dockerImageFileList = this.findDockerAppTypeRelImgFile(dockerAppTypeId);
		dockerAppTypeDetailDTO.setDockerImageFileList(dockerImageFileList);
		
		return dockerAppTypeDetailDTO;
	}
	
	@Override
	public List<DockerImageFileDTO> findDockerAppTypeRelImgFile(Long dockerAppTypeId) throws Exception {
		
		List<DockerImageFileDTO> dockerImageFileList = new ArrayList<DockerImageFileDTO>();
		DockerAppImage dockerAppImage = new DockerAppImage();
		dockerAppImage.setDockerAppTypeId(dockerAppTypeId);
		List<DockerAppImage> dockerAppImageList = dockerAppImageDao.selectByExample(dockerAppImage);
		
		if(dockerAppImageList != null && dockerAppImageList.size() > 0) {
			
			StringBuilder dockerImageFileIds = new StringBuilder("(");
			for(DockerAppImage dai : dockerAppImageList) 
				dockerImageFileIds.append(dai.getDockerImageFileId()).append(",");
			dockerImageFileIds.substring(0, dockerImageFileIds.length() - 1);
			dockerImageFileIds.append(")");
			List<DockerImage> difList = dockerImageFileDao.findByIdStr(dockerImageFileIds.toString());
			
			if(difList != null && difList.size() > 0) {
				for(DockerImage dif : difList) {
					//DockerImageFileDTO dockerImageFileDTO = new DockerImageFileDTO(dif, null);
					DockerImageFileDTO dockerImageFileDTO = new DockerImageFileDTO();
					BeanUtils.applyIf(dockerImageFileDTO, dif, true);
					dockerImageFileList.add(dockerImageFileDTO);
				}
			}
		}
		return dockerImageFileList;
	}
	
	@Override
	public Long insertAppTypeAndSelectImageFile(DockerAppTypeDTO dockerAppTypeDTO) {
		
		Long newDockerAppTypeId = this.insertAppType(dockerAppTypeDTO);
		String now = DateUtils.getCurDate(DateUtils.YYYYMMDDHHMMSS);
		
		String[] dockerImageFileIds = dockerAppTypeDTO.getDockerImageFileIds();
		if(dockerImageFileIds != null && dockerImageFileIds.length > 0) {
			List<DockerAppImage> dockerAppImageList = new ArrayList<DockerAppImage>();
			for(int i = 0; i < dockerImageFileIds.length; i++) {
				DockerAppImage dockerAppImage = new DockerAppImage();
				dockerAppImage.setDockerAppTypeId(newDockerAppTypeId);
				dockerAppImage.setDockerImageFileId(Long.valueOf(dockerImageFileIds[i]));
				dockerAppImage.setCreateUserId(11111111L);
				dockerAppImage.setCreateTime(now);
				dockerAppImage.setLastUpdateUserId(111111111L);
				dockerAppImage.setLastUpdateTime(now);
				dockerAppImageList.add(dockerAppImage);
			}
			dockerAppImageDao.jdbcBatchInsert(dockerAppImageList);
		}
		
		return newDockerAppTypeId;
	}

	@Override
	public Long insertAppType(DockerAppTypeDTO dockerAppTypeDTO) {
		DockerAppType dockerAppType = dockerAppTypeDTO.getDockerAppType();
		String now = DateUtils.getCurDate(DateUtils.YYYYMMDDHHMMSS);
		dockerAppType.setCreateUserId(111111L);
		dockerAppType.setCreateTime(now);
		dockerAppType.setLastUpdateUserId(111111L);
		dockerAppType.setLastUpdateTime(now);
		Long newDockerAppTypeId = dockerAppTypeDao.insert(dockerAppType);
		return newDockerAppTypeId;
	}
	
	@Override
	public int updateAppTypeAndSelectImageFile(DockerAppTypeDTO dockerAppTypeDTO) {
		
		DockerAppType dockerAppType = dockerAppTypeDTO.getDockerAppType();
		String now = DateUtil.formatDate(new Date());
		dockerAppType.setLastUpdateUserId(111111L);
		dockerAppType.setLastUpdateTime(now);
		int updateCode = dockerAppTypeDao.updateByPrimaryKey(dockerAppType);
		
		dockerAppImageDao.deleteByDockerAppTypeId(dockerAppType.getId());
		String[] dockerImageFileIds = dockerAppTypeDTO.getDockerImageFileIds();
		if(dockerImageFileIds != null && dockerImageFileIds.length > 0) {
			List<DockerAppImage> dockerAppImageList = new ArrayList<DockerAppImage>();
			for(int i = 0; i < dockerImageFileIds.length; i++) {
				DockerAppImage dockerAppImage = new DockerAppImage();
				dockerAppImage.setDockerAppTypeId(dockerAppType.getId());
				dockerAppImage.setDockerImageFileId(Long.valueOf(dockerImageFileIds[i]));
				dockerAppImage.setCreateUserId(11111111L);
				dockerAppImage.setCreateTime(now);
				dockerAppImage.setLastUpdateUserId(111111111L);
				dockerAppImage.setLastUpdateTime(now);
				dockerAppImageList.add(dockerAppImage);
			}
			dockerAppImageDao.jdbcBatchInsert(dockerAppImageList);
		}
		
		return updateCode;
	}

	@Override
	public int updateAppType(DockerAppTypeDTO dockerAppTypeDTO) {
		DockerAppType dockerAppType = this.findByPrimaryKey(dockerAppTypeDTO.getId());
		dockerAppType.setAppName(dockerAppTypeDTO.getAppName());
//		dockerAppType.setTenantId(dockerAppTypeDTO.getTenantId());
		dockerAppType.setRule(dockerAppTypeDTO.getRule());
		dockerAppType.setContent(dockerAppTypeDTO.getContent());
		String now = DateUtils.getCurDate(DateUtils.YYYYMMDDHHMMSS);
		dockerAppType.setLastUpdateUserId(111111L);
		dockerAppType.setLastUpdateTime(now);
		return dockerAppTypeDao.updateByPrimaryKey(dockerAppType);
	}
	
	@Override
	public int deleteByPrimaryKey(Long id) {
		if(StringUtils.isNullOrEmpty(id))
			return -1;
		
		DockerAppType entity = new DockerAppType();
		entity.setId(id);
		dockerAppImageDao.deleteByDockerAppTypeId(entity.getId());
		return dockerAppTypeDao.deleteByPrimaryKey(entity);
	}

	@Override
	public DockerAppType findByPrimaryKey(Long id) {
		
		if(StringUtils.isNullOrEmpty(id))
			return null;
		
		DockerAppType filter = new DockerAppType();
		filter.setId(id);
		return dockerAppTypeDao.selectByPrimaryKey(filter);
	}
	
	@Override
	public void batchAddImgFileToAppType(Long[] imageFileIds, Long appTypeId) {
		if(imageFileIds == null || imageFileIds.length == 0)
			return;
		
		List<DockerAppImage> dockerAppImageList = new ArrayList<DockerAppImage>();
		for(int i = 0; i < imageFileIds.length; i++) {
			DockerAppImage dockerAppImage = new DockerAppImage();
			dockerAppImage.setDockerAppTypeId(appTypeId);
			dockerAppImage.setDockerImageFileId(imageFileIds[i]);
			String now = DateUtils.getCurDate(DateUtils.YYYYMMDDHHMMSS);
			dockerAppImage.setCreateTime(now);
			dockerAppImage.setCreateUserId(111111L);
			dockerAppImage.setLastUpdateTime(now);
			dockerAppImage.setLastUpdateUserId(111111L);
			dockerAppImageList.add(dockerAppImage);
		}
		dockerAppImageDao.jdbcBatchInsert(dockerAppImageList);
	}
}
